from django.shortcuts import render

# Create your views here.
import re
import telnetlib

import nmap
import paramiko
from django.http import  HttpResponse

from CMDB.settings import base

from .models import  Server

# Create your views here.


def get_active_hosts(hosts='172.25.135.13', ports='22,80'):
    """根据提供的网段或者IP返回存活的主机IP"""
    # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
    nm = nmap.PortScanner()
    # 以指定方式扫描指定主机或网段的指定端口
    result = nm.scan(hosts=hosts, ports=ports, arguments='-n ')
    return nm.all_hosts()


def is_ssh_up(host='172.25.135.13', port=22, timeout=5):
    # 实例化对象
    tn = telnetlib.Telnet(host=host, port=port)
    # read_until读取直到遇到了换行符或超时秒数。默认返回bytes类型，通过decode方法解码为字符串。
    result = tn.read_until(b'\n', timeout=timeout).decode('utf-8')
    # 通过正则匹配且忽略大小写， 寻找是否ssh服务开启。
    searchObj = re.search('ssh', result, re.I)
    # 如果能匹配到内容， 说明ssh服务开启， 是Linux服务器.
    if searchObj:
        return True
    else:
        return False


def login_ssh_key(host, port, user, keyfile, command):
    # 实例化SSH客户端对象
    with paramiko.SSHClient() as client:
        # 配置私人密钥文件位置
        private = paramiko.RSAKey.from_private_key_file(keyfile)
        # 自动添加当前主机到远程服务器的known_hosts, 远程连接不需要再问yes/no
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 通过用户名和密码连接远程服务器,
        client.connect(
            hostname=host,
            port=port,
            username=user,
            pkey=private
        )
        # 连接成功后执行命令
        stdin, stdout, stderr = client.exec_command(command)
        return stdout.read().decode('utf-8')


def scanhost(request):
    # 访问所有要扫描的网段/IP
    for host in base.scanhosts:
        print("正在扫描%s......" %(host))
        # 获取所有可以ping通的主机IP
        active_hosts = get_active_hosts(hosts=host)
        # 一次遍历判断ssh服务是否开启
        for active_host in active_hosts:
            if is_ssh_up(active_host):
                server = Server()
                # 设置IP地址
                server.IP = active_host
                # 执行指令
                for attr, command in base.commands.items():
                    # attr ='hostname' , command = 'hostname'
                    # 存储主机名、操作系统.....指令执行的结果
                    result = login_ssh_key(active_host, 22, 'root', '/mnt/id_rsa', command)
                    setattr(server, attr, result)
                server.save()
        return  HttpResponse('扫描成功')
